<?php

namespace app\service;


use GatewayWorker\BusinessWorker;
use GatewayWorker\Gateway;
use GatewayWorker\Lib\Gateway as libGateway;
use GatewayWorker\Register;
use Workerman\Worker;

class GatewayWorkerService extends Service
{
    public function __construct()
    {
        parent::__construct();
    }

    // public static function startBusinessWorker()
    // {
    //     // bussinessWorker 进程
    //     $worker = new  BusinessWorker();
    //     // worker名称
    //     $worker->name = 'privateChat';
    //     // bussinessWorker进程数量
    //     $worker->count = 4;
    //     // 服务注册地址
    //     $worker->registerAddress = '127.0.0.1:1236';
    //
    //     // 如果类带有命名空间，则需要把命名空间加上，
    //     //  类似$worker->eventHandler='\my\namespace\MyEvent';
    //     $worker->eventHandler = 'app\service\GatewayWorkerService';
    //
    //     // 如果不是在根目录启动，则运行runAll方法
    //     Worker::runAll();
    // }
    //
    // public static function startGateway()
    // {
    //     // gateway 进程，这里使用Text协议，可以用telnet测试
    //     $gateway = new Gateway("Websocket://0.0.0.0:8282");
    //     // gateway名称，status方便查看
    //     $gateway->name = 'HtGateway';
    //     // gateway进程数
    //     $gateway->count = 4;
    //     // 本机ip，分布式部署时使用内网ip
    //     $gateway->lanIp = '127.0.0.1';
    //     // 内部通讯起始端口，假如$gateway->count=4，起始端口为4000
    //     // 则一般会使用4000 4001 4002 4003 4个端口作为内部通讯端口
    //     $gateway->startPort = 2900;
    //     // 服务注册地址
    //     $gateway->registerAddress = '127.0.0.1:1236';
    //
    //     // 心跳间隔
    //     $gateway->pingInterval = 10;
    //     // 心跳数据
    //     $gateway->pingData = '{"type":"ping"}';
    //
    //     // 如果不是在根目录启动，则运行runAll方法
    //     Worker::runAll();
    // }
    //
    // public static function startRegister()
    // {
    //     // register 必须是text协议
    //     $register = new Register('text://0.0.0.0:1236');
    //     Worker::runAll();
    // }

    /**
     * 发送消息
     * @param $data
     */
    public static function sendMsg($type, $data)
    {
        if (empty(libGateway::getAllClientIdCount())) {
            return;
        }
        $send_msg = json_encode(['type' => $type, 'data' => $data], JSON_UNESCAPED_UNICODE);
        // 主动推送消息
        libGateway::$registerAddress      = config('gateway.register_connection');
        // 与Gateway是否是长链接
        libGateway::$persistentConnection = true;
        return libGateway::sendToAll($send_msg);
    }


    /**
     * 当客户端连接时触发
     * 如果业务不需此回调可以删除onConnect
     * @param int $client_id 连接id
     */
    public static function onConnect($client_id)
    {
        libGateway::sendToClient($client_id, json_encode(array(
            'type'      => 'init',
            'client_id' => $client_id
        )));
    }

    /**
     * 当客户端发来消息时触发
     * @param int $client_id 连接id
     * @param mixed $message 具体消息
     */
    public static function onMessage($client_id, $message)
    {

    }

    /**
     * 当用户断开连接时触发
     * @param int $client_id 连接id
     */
    public static function onClose($client_id)
    {

    }
}